﻿using System;
using System.Data;
using System.Diagnostics;
using ErickOrlando.Utilidades.Configuraciones;
using System.Configuration;
using System.Data.SqlClient;

namespace ErickOrlando.Utilidades.Trazas
{

    /// <summary>
    /// Permite registrar las trazas en una Base de Datos
    /// </summary>
    /// <remarks>Erick Orlando © 2012</remarks>
    public class BaseDatosTraceListener : TraceListener
    {

        /// <summary>
        /// Permite crear una instancia de <see cref="BaseDatosTraceListener"/>
        /// </summary>
        public BaseDatosTraceListener()
        {
        }

        /// <summary>
        /// Permite escribir un mensaje en el Listener
        /// </summary>
        /// <param name="message"></param>
        public override void Write(string message)
        {
            EscribirMensaje(message);
        }

        /// <summary>
        /// Permite escribir un mensaje en el Listener
        /// </summary>
        /// <param name="message"></param>
        public override void WriteLine(string message)
        {
            EscribirMensaje(message);
        }

        private static bool Grabar()
        {
			return EventosEnBD.Instance.GrabarLog;
        }

        /// <summary>
        /// Devuelve la Cadena de Conexion
        /// </summary>
        public string CadenaConexion
        {
            get
            {
                return ConfigurationManager.
					ConnectionStrings[EventosEnBD.Instance.Conexion].ConnectionString;
            }
        }


        private void EscribirMensaje(string message)
        {
            if (!Grabar())
                return;

            using (var cn = new SqlConnection(CadenaConexion))
            {
                using (var cmd = cn.CreateCommand())
                {
                    cn.Open();
                    cmd.CommandText = "uspAddRegistroEventos";
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.AddWithValue("@Mensaje", message);
                    cmd.Parameters.AddWithValue("@Modulo", EventosEnBD.Instance.NombreAplicacion);
                    cmd.Parameters.AddWithValue("@Usuario", Environment.UserName);
                    cmd.ExecuteNonQuery();
                }
            }

        }

        /// <summary>
        /// Permite liberar recursos
        /// </summary>
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
        }

    }
}
